<?php

namespace core;

/**
 * 一个简单的静态事件调度器
 */
class Event
{
    /**
     * 存储所有已注册的监听器
     * @var array
     */
    protected static array $listeners = [];

    /**
     * 注册一个事件监听器
     *
     * @param string $event 事件名称 (例如 'user.registered')
     * @param string|callable $listener 监听器类名或可调用函数
     * @return void
     */
    public static function listen(string $event, $listener): void
    {
        static::$listeners[$event][] = $listener;
    }

    /**
     * 分发一个事件，并调用所有相关的监听器
     *
     * @param string $event 事件名称
     * @param mixed ...$args 传递给监听器 handle 方法的参数
     * @return void
     */
    public static function dispatch(string $event, ...$args): void
    {
        if (!isset(static::$listeners[$event])) {
            return;
        }

        foreach (static::$listeners[$event] as $listener) {
            // 如果监听器是一个类名字符串，则实例化它
            if (is_string($listener) && class_exists($listener)) {
                $listenerInstance = new $listener();
                // 假设所有基于类的监听器都有一个 handle 方法
                if (method_exists($listenerInstance, 'handle')) {
                    $listenerInstance->handle(...$args);
                }
            } elseif (is_callable($listener)) {
                // 如果监听器本身就是一个可调用函数（例如闭包），则直接调用
                $listener(...$args);
            }
        }
    }
}
